const express = require('express');
const app = express();
const http = require('http').createServer(app);
const io = require('socket.io')(http);

/**
 * 串口数据并不会按照换行形式进行发送，需要使用Parser工具进行缓存后输出
 * Readline Parser每读完一行输出
 * //https://serialport.io/docs/api-parser-readline
 * Parsers说明：
    parser-byte-length：
    大概意思是定义了一个长度为length字节的buffer，串口收到数据后先放到buffer中，放满了才发送给程序，超出的部分等buffer发送清空后继续放入
    parser-cctalk：
    一种在货币交易等行业广泛使用的串行协议
    parser-delimiter：
    意思是遇到某个字符时才把buffer中的数据发给程序，比如设为’a’，那么用字符发送时遇到’a’即发送，用hex发送时遇到61（‘a’的ASCII码）时发送；注：官方例子中’\n’字符用串口工具字符发送没生效，但用hex发送其ASCII码（0A）和在node.js项目中可以生效
    parser-readline:
    可以自定义换行符，遇到换行符时发送，默认为’\r\n’，对应ASCII为0D 0A；但目前打hex日志时为乱码
    parser-ready：
    程序先收到自定义字符串，例’READY’后才开始接收数据
    parser-regex：
    正则表达式
 */
const SerialPort = require('serialport');
const Readline = require('@serialport/parser-readline');
const port = new SerialPort('COM8', {
  'baudRate': 9600,
  dataBits: 8,    //数据位
  parity: 'none',  //奇偶校验
  stopBits: 1,  //停止位
});

let socketConnect = false;

app.use(express.static("public"));

/*app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});*/

io.on('connection', function(socket){
  console.log('a user connected');
  socketConnect = true;
  socket.on('disconnect', function(){
    console.log('user disconnected');
  });
});

port.on('open', function () {
  //writeport();
  console.log('open serial');
});


let val = [];

function dataFilter(str) {
  if(str.indexOf("Input") > -1){
    //Input: 26.00,  Output: 1000.00
    let temp = str.split(",")[0].replace("Input:", "").trim();
    let status = str.indexOf("[+]") > -1;
    //console.log(temp);
    io.sockets.emit('data', {
      t: Number(temp),
      s: Number(status)
    });
  }else if(str.indexOf("Setpoint") > -1){
    //console.log("state: 1");
    io.sockets.emit('Setpoint', Number(str.replace("Setpoint: ", "")));
  }
}

const parser = port.pipe(new Readline({ delimiter: '\r\n' }));
parser.on('data', data => {

  let strLine = data.toString('ascii');
  //console.log(tmpArr)
  console.log('rev:', strLine);

  if(socketConnect){
    dataFilter(strLine);
  }
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});
